package com.aaa.sys.service.impl;

import cn.hutool.core.util.StrUtil;
import com.aaa.sys.entity.Role;
import com.aaa.sys.dao.RoleDao;
import com.aaa.sys.service.RoleService;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.Page;
import org.springframework.transaction.annotation.Transactional;


import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 角色信息表(Role)表服务实现类
 *
 * @author makejava
 * @since 2023-06-23 15:37:32
 */
@Service("roleService")
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDao roleDao;


    /**
     * 查询用户的角色返回角色ID数组
     *
     * @param userId
     * @return
     */
    @Override
    public ArrayList queryRoleIdsByUserId(Integer userId) {
        List<Role> roleList = roleDao.queryRoleIdsByUserId(userId);
        ArrayList arrayList = new ArrayList();
        if (roleList != null && roleList.size() > 0){
        for (Role role : roleList) {
            arrayList.add(role.getRoleId());
        }
        }

        return arrayList;
    }

    /**
     * 查询所以角色
     * @return
     */
    @Override
    public List<Role> queryAll() {
        return roleDao.queryAll();
    }

    /**
     * 更新权限删除角色
     * @param roleId
     * @return
     */
    @Transactional
    @Override
    public int updateMenuIdDelRoleId(Integer roleId) {
        //根据roleId 删除角色之前，先调用服务层接口删除该角色绑定的权限ID
        int sucNum = this.deleteMenuIdsByRoleId(roleId);
        if (sucNum>0){
            System.out.println("---------------------根据角色Id删除所拥有的权限成功！");
        }else {
            System.out.println("---------------------根据角色Id删除所拥有的权限失败！！！");
        }
        //调用继承BaseController的方法进行统一的封装使用
        boolean isTrue = this.deleteById(roleId);
        if (isTrue){
            return 1;
        }
        return 0;
    }

    /**
     * 根据角色id删除菜单id
     * @param roleId
     * @return
     */
    @Override
    public int deleteMenuIdsByRoleId(Integer roleId) {
        return roleDao.deleteMenuIdsByRoleId(roleId);
    }


    /**
     * 添加角色和权限关联
     * @param roleId
     * @param menuIds
     * @return
     */
    @Transactional  //保证该方法中调用的所有方法一期提交或者一起回滚
    @Override
    public int batchInsertRoleMenu(Integer roleId, String menuIds) {
        //1.先调用根据角色id删除角色权限关联表的方法
        this.deleteMenuIdsByRoleId(roleId);

        //2.再添加关联
        //添加是否成功标识符
        boolean flag = true;

        //判断menuIds是否为空 不为空时  进行 分割 添加 操作
        if(StrUtil.isNotEmpty(menuIds)){
            //进行分割为数组
            String[] ids = menuIds.split(",");
            //循环数组
            for (String id : ids) {
                //调用batchInsertRoleMenu方法进行添加所选的menuId进行添加
                int sucNum = roleDao.batchInsertRoleMenu(roleId, Integer.valueOf(id));
                if (sucNum<1){
                    //说明调用失败
                    flag=false;
                }
            }
        }
        //如果循环添加结束，flag仍然是true说明 全部成功
        if(flag){
            return 1;
        }
        return 0;
    }



    /**
     * 根据角色id查询权限id
     * @param roleId
     * @return
     */
    @Override
    public List<Integer> queryMenuIdsByRoleId(Integer roleId) {
        return roleDao.queryMenuIdsByRoleId(roleId);
    }

    /**
     * 通过ID查询单条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    @Override
    public Role queryById(Integer roleId) {
        return this.roleDao.queryById(roleId);
    }

    /**
     * 分页查询
     *
     * @param page 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo queryByPage(Page<Role> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMsg());
        }
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        Role role = page.getData();
        return new PageInfo(roleDao.queryAllByLimit(role));
    }

    /**
     * 新增数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role insert(Role role) {
        this.roleDao.insert(role);
        return role;
    }

    /**
     * 修改数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role update(Role role) {
        this.roleDao.update(role);
        return this.queryById(role.getRoleId());
    }

    /**
     * 通过主键删除数据
     *
     * @param roleId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer roleId) {
        return this.roleDao.deleteById(roleId) > 0;
    }
}
